package net.siufung.core.utils;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.CompressionLevel;
import net.lingala.zip4j.model.enums.CompressionMethod;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Arrays;

/**
 * @author 陈建峰
 * @since 2022/8/26 11:50 下午
 */
@Slf4j
public class FileUtil extends cn.hutool.core.io.FileUtil {

    public static final String ZIP_FILE_EXT = ".zip";

    /**
     * 检测文件不存在使用创建文件
     * @param filePath 文件路径
     * @return 文件是否存在
     */
    public static Boolean existDir(File filePath) {
        return exist(filePath);
    }

    /**
     * 检测文件不存在使用创建文件
     * @param filePath 文件路径
     * @param mkParentDir 创建文件夹
     * @return 文件是否存在
     */
    public static Boolean existDir(File filePath, Boolean mkParentDir) {
        Boolean existFilePath = existDir(filePath);
        if (!existFilePath) {
            if (mkParentDir) {
                File parentFile = filePath.getParentFile();
                if(!existDir(parentFile)){
                    if(parentFile.mkdirs()){
                        log.info(("创建目录： [" + parentFile + "] was successful."));
                    }
                }
            }
        }
        return existFilePath;
    }

    /**
     * 批量创建文件路径
     * @param paths 文件路径集合
     */
    public static void batchMkdirs(String[] paths){
        Arrays.stream(paths).distinct().forEach((path) -> {
            existDir(new File(path), true);
        });
    }

    /**
     * 包格式化成文件路径
     * @param parentDir 父级文件夹
     * @param packageName 包名称
     * @return String
     */
    public static String packageFormattedAsPaths(String parentDir, String packageName) {
        if (!StrUtil.endWith(parentDir, FILE_SEPARATOR)) {
            parentDir += FILE_SEPARATOR;
        }
        packageName = packageName.replaceAll("\\.", StringPool.BACK_SLASH + FILE_SEPARATOR);
        return parentDir + packageName;
    }

    /**
     * 创建zip压缩包
     * @param outputDir 文件路径
     * @return FileInputStream 文件流
     */
    public static FileInputStream createZip(String outputDir) throws ZipException, FileNotFoundException {
        String zipName = outputDir + FileUtil.ZIP_FILE_EXT;
        ZipFile zipFile = new ZipFile(zipName);
        ZipParameters zipParameters = new ZipParameters();
        zipParameters.setCompressionMethod(CompressionMethod.DEFLATE);
        zipParameters.setCompressionLevel(CompressionLevel.NORMAL);
        File currentFile = new File(outputDir);
        File[] listFiles = currentFile.listFiles();
        if(ArrayUtil.isNotEmpty(listFiles)){
            for (File file : listFiles) {
                if (file.isDirectory()) {
                    zipFile.addFolder(new File(file.getPath()), zipParameters);
                } else {
                    zipFile.addFile(file, zipParameters);
                }
            }
        }
        return new FileInputStream(zipName);

    }

}
